/*头文件引用*/
#include <REGX52.H>
#include "seg.h"
#include "key.h"
typedef unsigned char u8;

/* 变量声明区域 */
u8 seg_mode = 0;//数码管显示模式变量 0-时钟显示界面 1-时钟设置界面 2 - 闹钟设置界面
u8 seg_slow_down = 0;//数码管显示延时量//500
u8 key_slow_down = 0;//按键消抖变量
u8 seg_pos = 0;//数码管位选变量
u8 seg_a = 0;//seg_buf数组索引
u8 seg_buf[6] = {0};//选择数码管数数组
u8 clock_flag = 1;//设置时钟时的闪烁flag
short count1000ms  = 0;//定时器1s变量
short count500ms = 0;//定时器500ms变量
u8 count200ms = 0;//定时器200ms
u8 clock_init[3] = {23,59,55};//初始时钟显示界面
u8 clock_set[3] = {0};//时钟设置显示界面
u8 alarm_clock[3] = {0};//闹钟设置画面
u8 alarm_temp[3] = {0};//判断合法与否
u8 key_val,key_down,key_up,key_old;//按键处理变量
u8 clock_change = 0;//用于修改时钟的时分秒
u8 i = 0;//循环变量
u8 j = 0;//循环变量用于处理判断输入的时各位还是十位
u8 k = 0;
u8 gewei = 0;//输入数据时的个位
u8 shiwei = 0;//输入数据的十位
u8 eg1 = 0;//判断时钟设置按钮的初次按下
u8 eg2 = 0;//判断闹钟设置按钮的初次按下
u8 alarm_enable = 1;//闹钟使能
u8 LED_flag;
/* LED闹钟使能 */
void LED_proces()
{
		if(alarm_clock[0] == clock_init[0]&&alarm_clock[1] == clock_init[1]&&alarm_clock[2] == clock_init[2] && alarm_enable == 1)
			P2_0 = LED_flag;
}

/* 时钟输入更新函数 */
void update_clock(u8 digit)
{
	if(j == 0)
	{
		gewei = digit;
		shiwei = clock_init[clock_change] /10 %10;
		clock_init[clock_change] = shiwei *10 +gewei;
		j++;
	}
	else if(j == 1)//进位
	{
		shiwei = clock_init[clock_change] %10;
		gewei = digit;		
		clock_init[clock_change] = shiwei *10 +gewei;
	}
}
void update_alram(u8 digit)
{
	if(k == 0)
	{
		gewei = digit;
		shiwei = alarm_clock[clock_change] /10 %10;
		alarm_clock[clock_change] = shiwei *10 +gewei;
		k++;
	}
	else if(k == 1)//进位
	{
		shiwei = alarm_clock[clock_change] %10;
		gewei = digit;		
		alarm_clock[clock_change] = shiwei *10 +gewei;
	}
}
/* 按键处理函数 */
void Key_proc()
{	
	if(key_slow_down)return;
	key_slow_down = 1;
	
	key_val = Key_read();
	key_down = key_val & (key_val ^ key_old);
	key_up = ~key_val & (key_val ^ key_old);
	key_old = key_val;
	
	switch(key_down)
	{					
		case 4: 			
		{				
			seg_mode = 1;
			if(eg1 == 0)
			{
				clock_set[0] = clock_init[0];
				clock_set[1] = clock_init[1];
				clock_set[2] = clock_init[2];				
				eg1 = 1;
			}
			else
			{
				clock_change++;
				if(clock_change  == 3)
				clock_change = 0;													
			}			
			break;
		}
		case 13:
		{
			if(seg_mode == 1||seg_mode == 2)
			{
				if(clock_init[0]<0||clock_init[0]>=24 && clock_init[2]<0||clock_init[2]>=60 && clock_init[1]<0||clock_init[1]>=60)
				{
					clock_init[0] = clock_set[0];
					clock_init[1] = clock_set[1];
					clock_init[2] = clock_set[2];					
				}			
				else 
				{
					seg_mode = 0;//保存后回到模式一
					eg1 = 0;//将时钟设置计数置零
				}
				if(alarm_temp[0]<0||alarm_temp[0]>=24 && alarm_temp[2]<0||alarm_temp[2]>=60 && alarm_temp[1]<0||alarm_temp[1]>=60)
				{
					alarm_clock[0] = alarm_temp[0];
					alarm_clock[1] = alarm_temp[1];
					alarm_clock[2] = alarm_temp[2];
				}
				else
				{
					seg_mode = 0;
					eg2 = 0;
				}
			}
			break;			
		}
		case 15:
		{
			if(seg_mode == 1)
			{
				clock_init[0] = clock_set[0];
				clock_init[1] = clock_set[1];
				clock_init[2] = clock_set[2];
			}
			if(seg_mode == 2)
			{
				alarm_clock[0] = alarm_temp[0];
				alarm_clock[1] = alarm_temp[1];
				alarm_clock[2] = alarm_temp[2];
				
			}				
			break;
		}
		case 8:
		{
				seg_mode = 2;
				if(eg1 == 0)
				{	  					
					eg1 = 1;
				}
				else
				{
					clock_change++;
					if(clock_change  == 3)
					clock_change = 0;													
				}
			break;				
		}
					
		case 12:
		{
			if(seg_mode == 0 )
			{
				alarm_enable = 1;				
			}			
			break;
		}
		default:break;
	}
	if(seg_mode == 1)
	{
		switch(key_down)
		{			
			case 1:update_clock(1);break;
			case 2:update_clock(2);break;			
			case 3:update_clock(3);break;
			case 5:update_clock(4);break;				
			case 6:update_clock(5);break;		
			case 7:update_clock(6);break;				
			case 9:update_clock(7);break;		
			case 10:update_clock(8);break;
			case 11:update_clock(9);break;		
			case 14:update_clock(0);update_alram(0);break;			
		}				
	}
		if(seg_mode == 2)
		{
		switch(key_down)
		{			
			case 1:update_alram(1);break;
			case 2:update_alram(2);break;			
			case 3:update_alram(3);break;
			case 5:update_alram(4);break;				
			case 6:update_alram(5);break;		
			case 7:update_alram(6);break;				
			case 9:update_alram(7);break;		
			case 10:update_alram(8);break;
			case 11:update_alram(9);break;		
			case 14:update_alram(0);break;			
		}				
		}
}
/* 时钟进位处理函数 */
void clock_proc()
{
	clock_init[2]++;
	if(clock_init[2] == 60)
	{
		clock_init[2] = 0;
		clock_init[1]++;
		if(clock_init[1] == 60)
		{
			clock_init[1] = 0;
			clock_init[0]++;
			if(clock_init[0] == 24)
			{
				clock_init[0] = 0; 
			}
		}
	}
}
/*数码管显示信息处理函数*/
void Seg_proc()
{
	if(seg_slow_down)return;
	seg_slow_down  = 1;
	
	switch(seg_mode)
	{
		case 0:
		{
			for(i = 0;i < 3;i++)
			{
				seg_buf[2*i] = clock_init[i] /10 %10;
				seg_buf[1+2*i] = clock_init[i] %10;
			}
			break;
		}
		case 1:
		{
			for(i = 0;i < 3;i++)
			{
				seg_buf[2*i] = clock_init[i] /10 %10;
				seg_buf[1+2*i] = clock_init[i] %10;
			}
			seg_buf[0+2*clock_change] = clock_flag?clock_init[clock_change] /10 %10 : 10;
			seg_buf[1+2*clock_change] = clock_flag?clock_init[clock_change] %10 : 10;
			break;	
		}
		case 2:
		{
			for(i = 0;i < 3;i++)
			{
				seg_buf[2*i] = alarm_clock[i] /10 %10;
				seg_buf[1+2*i] = alarm_clock[i] %10;
			}
			seg_buf[0+2*clock_change] = clock_flag?alarm_clock[clock_change] /10 %10 : 10;
			seg_buf[1+2*clock_change] = clock_flag?alarm_clock[clock_change] %10 : 10;
			break;	
		}			
	}

}
/* 定时器终端初始化函数 */
void Timer0Init(void)		//1毫秒@12.000MHz
{
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
	ET0 = 1;
	EA = 1;
}

/* 定时器0中断服务函数 */
void timer0server() interrupt 1
{
	TL0 = 0x18;		//设置定时初值
	TH0 = 0xFC;		//设置定时初值
	if(++seg_slow_down == 500)seg_slow_down = 0;
	if(++count500ms == 500)
	{
		count500ms =0;
		clock_flag = !clock_flag;
	}
	if(++count1000ms == 1000)
		{
			count1000ms = 0;
			clock_proc();
		}
	if(++count200ms == 200)
	{
		count200ms = 0;
		LED_flag = !LED_flag;
	}
	if(++key_slow_down == 10) key_slow_down = 0;
	if(++seg_pos == 8) seg_pos = 0;	
	if(seg_pos == 2||seg_pos == 5)return;
	if(++seg_a == 6)seg_a = 0;
	Seg_disp(seg_pos,seg_buf[seg_a]);
}
/* main函数 */
void main()
{
	Timer0Init();
	while(1)
	{
		
		Seg_proc();
		Key_proc();
		LED_proces();
	}
}
